package com.choosefine.it.cprivilege.service;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import com.choosefine.it.common.def.CommonConstant;
import com.choosefine.it.common.def.ResultCode;
import com.choosefine.it.common.exception.BusinessException;
import com.choosefine.it.common.utils.MD5;
import com.choosefine.it.cprivilege.dao.AccountMapper;
import com.choosefine.it.cprivilege.dao.AccountRoleMapper;
import com.choosefine.it.cprivilege.model.Account;
import com.choosefine.it.cprivilege.model.dto.AccountDTO;
import com.choosefine.it.cprivilege.model.dto.AccountSearchDTO;
import com.choosefine.it.cprivilege.model.vo.AccountRoleVO;
import com.choosefine.it.cprivilege.model.vo.AccountVO;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.google.gson.Gson;

/**
 * 
 * Author：liaozhanggen
 * Create Date：2017年2月18日
 * Version：v2.0
 */
@Service
public class AccountService {

	@Autowired
	private AccountMapper accountMapper;
	@Autowired
	private AccountRoleMapper accountRoleMapper;
	
	private Gson gson = new Gson();

	/** 
	 * 添加账户功能
	 * @throws BusinessException 
	 * 
	 * @Author：liaozhanggen
	 * @Create Date：2017年2月18日
	 * @param：....
	 * @return：int
	 */
	public int addAccount(AccountDTO accountDTO) throws BusinessException {

		Account account = null;
		accountDTO.setId(0);
		validAccountNum(accountDTO); //校验帐户名是 否存在
		//加密
		accountDTO.setPassword(MD5.stringMD5(accountDTO.getPassword()));
		checkOperatorPwd(accountDTO);	//检查操作员密码确认
		
		account = gson.fromJson(gson.toJson(accountDTO), Account.class);
		//添加账户功能
		int success = accountMapper.addAccount(account);
		//更新账户号 
		//为自动生成的编号 ,编号规则：QH-趋恒首字母    00001-人员的自增编号
		if (success>0 && account.getId() > 0) {
			account.setUserCode("QH".concat(accountUserCode(account.getId())));
			success = accountMapper.updateAccount(account);
		}
		if (success == 0 || StringUtils.isEmpty(accountDTO.getRoles())) {
			return success;
		}
		
		//添加账户与角色的关系 
		if (success > 0) {
			List<String> roles = Arrays.asList(accountDTO.getRoles().split(","));
			for (String role : roles) {
				Integer.parseInt(role); //校验传递的参数是否正确
			}
			Map<String,Object> param = new HashMap<>();
			param.put("accountId", account.getId());
			param.put("roles", roles);
			accountRoleMapper.insertAccountRole(param);
		}
		
		return success;
	}

	/** 
	 * 操作员密码确认
	 * @Author：liaozhanggen
	 * @Create Date：2017年2月18日
	 * @param：....
	 * @return：void
	 */
	private void checkOperatorPwd(AccountDTO accountDTO) throws BusinessException {
		accountDTO.setOperatorPwd(MD5.stringMD5(accountDTO.getOperatorPwd()));
		Account account = new Account(accountDTO.getOperatorAccount(), accountDTO.getOperatorPwd());
		//判断操作员密码输入确认是否正确
		if (accountMapper.findAccountByPwd(account) == 0) {
			throw new BusinessException(ResultCode.FAILED,CommonConstant.ACCOUNT_PASSWORD_IS_ERROR);
		}
	}

	/** 
	 * 帐户名校唯一性
	 * @Author：liaozhanggen
	 * @Create Date：2017年2月18日
	 * @param：....
	 * @return：void
	 */
	private void validAccountNum(AccountDTO accountDTO) throws BusinessException {
		//判断账户的有效性，是否在 
		if (accountMapper.validAccountExists(accountDTO) >= 1) {
			throw new BusinessException(ResultCode.FAILED,CommonConstant.ACCOUNT_IS_EXISTS_ERROR);
		}
	}

	/**
	 * 帐户编号生成 
	 *		编号规则：QH-趋恒首字母    00001-人员的自增编号
	 * @Author：liaozhanggen
	 * @Create Date：2017年2月18日
	 * @param：....
	 * @return：String
	 */
	private String accountUserCode(int id){
		int num = 100000;
		String userCode = (num + id) + "";
		if (userCode.length() == 6) {
			userCode = userCode.substring(1, userCode.length());
		}
		return userCode;
	}

	/** 
	 * 账号查询列表分页
	 * 
	 * @Author：liaozhanggen
	 * @Create Date：2017年2月18日
	 * @param：....
	 * @return：Object
	 */
	public Page<AccountRoleVO> queryAccountPage(AccountSearchDTO accSearchDTO) {
		
		PageHelper.startPage(accSearchDTO.getPageNum(), accSearchDTO.getPageSize());
		return accountRoleMapper.queryAccountRolePage(accSearchDTO);
	}

	/** 
	 * 编辑帐户
	 * @throws BusinessException 
	 * @Author：liaozhanggen
	 * @Create Date：2017年2月18日
	 * @param：....
	 * @return：int
	 */
	public int editAccount(AccountDTO accountDTO) throws BusinessException {
		Account account = null;
		if (accountDTO.getId() == 0) {
			throw new BusinessException(ResultCode.FAILED, String.format(CommonConstant.COMMON_IS_VALID,"Account Id"));
		}
		validAccountNum(accountDTO); //校验帐户名是 否存在
		//加密 TODO

		checkOperatorPwd(accountDTO);	//检查操作员密码确认
		
		account = gson.fromJson(gson.toJson(accountDTO), Account.class);
		account.setUserCode(null);
		//更新账户号 
		int num = accountMapper.updateAccount(account);

		if (num == 0 || StringUtils.isEmpty(accountDTO.getRoles())) {
			return num;
		}
		
		//添加账户与角色的关系 
		if (num > 0) {
			List<String> roles = Arrays.asList(accountDTO.getRoles().split(","));
			for (String role : roles) {
				Integer.parseInt(role); //校验传递的参数是否正确
			}
			//删除之前的帐户与角色的关系
			num = accountRoleMapper.deleteAccountRoleByAcc(account.getId());
			Map<String,Object> param = new HashMap<>();
			param.put("accountId", account.getId());
			param.put("roles", roles);
			num = accountRoleMapper.insertAccountRole(param);
		}
		return num;
	}

	/** 
	 * 删除帐户
	 * @Author：liaozhanggen
	 * @Create Date：2017年2月18日
	 * @param：....
	 * @return：int
	 */
	public int removeAccount(int id) {
		Account account = new Account(id);
		account.setIsValid(CommonConstant.INVALID);
		return accountMapper.deleteAccount(account);
	}

	/** 
	 * 单个账号详情
	 * @Author：liaozhanggen
	 * @Create Date：2017年2月18日
	 * @param：....
	 * @return：AccountVO
	 */
	public AccountVO detailAccount(int id) {
		Account account = new Account(id);
		return accountMapper.detailAccount(account);
	}

	/** 
	 * 根据帐户或编号重置帐户密码
	 * @Author：liaozhanggen
	 * @Create Date：2017年2月18日
	 * @param：....
	 * @return：Object
	 */
	public AccountVO restAccount(String userAccount) {
		Account account = new Account(userAccount);
		account.setPassword(CommonConstant.DEFAULT_PASSWORD); //重置密码 TODO
		//更新账户号 
		int num = accountMapper.updateAccount(account);
		if (num > 0) {
			return accountMapper.detailAccount(account);
		}
		return null;
	}

	/** 
	 * 登录
	 * 
	 * @throws BusinessException 
	 * @Author：liaozhanggen
	 * @Create Date：2017年2月18日
	 * @param：....
	 * @return：AccountVO
	 */
	public AccountVO loginAccount(AccountDTO accountDTO) throws BusinessException {
		if (StringUtils.isEmpty(accountDTO.getUserAccount())) {
			throw new BusinessException(ResultCode.FAILED, CommonConstant.ACCOUNT_NUM_VALID_IS_NULL);
		}
		if (StringUtils.isEmpty(accountDTO.getPassword())) {
			throw new BusinessException(ResultCode.FAILED, CommonConstant.ACCOUNT_PWD_VALID_IS_NULL);
		}
		Account account = new Account(accountDTO.getUserAccount(),accountDTO.getPassword()); //TODO 加密
		return accountMapper.loginAccount(account);
	}
}
